package com.cb2.algorithm.leetcode;

/**
 * <a href='https://leetcode.cn/problems/binary-tree-longest-consecutive-sequence'>二叉树最长连续序列(Binary Tree Longest Consecutive Sequence)</a>
 * <p>给你一棵指定的二叉树的根节点 root ，请你计算其中 最长连续序列路径 的长度。</p>
 * <p>最长连续序列路径 是依次递增 1 的路径。该路径，可以是从某个初始节点到树中任意节点，通过「父 - 子」关系连接而产生的任意路径。且必须从父节点到子节点，反过来是不可以的。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：root = [1,null,3,2,4,null,null,null,5]
 *                              1
 *                               \
 *                                3
 *                              /   \
 *                             2     4
 *                                    \
 *                                     5
 *      输出：3
 *      解释：当中，最长连续序列是 3-4-5 ，所以返回结果为 3 。
 *
 *  示例 2：
 *      输入：root = [2,null,3,2,null,1]
 *                               2
 *                                \
 *                                 3
 *                                /
 *                               2
 *                              /
 *                             1
 *      输出：2
 *      解释：当中，最长连续序列是 2-3 。注意，不是 3-2-1，所以返回 2 。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>树中节点的数目在范围 [1, 3 * 10^4] 内</li>
 *     <li>-3 * 10^4 <= Node.val <= 3 * 10^4</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2025/5/19 16:09
 */
public class LC0298BinaryTreeLongestConsecutiveSequence_M {
    private int ans;

    public int longestConsecutive(TreeNode root) {
        dfs(root);
        return ans;
    }

    private int dfs(TreeNode currNode) {
        if (currNode == null) {
            return 0;
        }
        int left = dfs(currNode.left);
        int right = dfs(currNode.right);
        if (currNode.left != null && currNode.val == currNode.left.val + 1) {
            left += 1;
        } else {
            left = 1;
        }
        if (currNode.right != null && currNode.val == currNode.right.val + 1) {
            right += 1;
        } else {
            right = 1;
        }
        int subMax = Math.max(left, right);
        ans = Math.max(ans, subMax);
        return subMax;
    }
}
